#include"vector.h"

#include<vector>
#include<string>

#if 0
void test01()
{
    // int数组
    vector<int> a = { 1,2,3,4 };
    for(auto e : a) cout << e << ' ';
    cout << endl;

    // double数组
    vector<double> d = { 1.1, 1.2, 1.3 };
    for(auto e : d) cout << e << ' ';
    cout << endl;

    // string数组
    vector<string> s = { "hello", "C++", "vector" };
    for(auto e : s) cout << e << ' ';
    cout << endl;
}

// 构造
void test02()
{
    vector<int> v1;         // 默认构造，v1为空
    vector<int> v2(5, 3);   // 用5个3构造，即{ 3,3,3,3,3 }; 
    vector<int> vv2(5);     // 对比v2，第二个参数不传就用默认值。用5个int默认值构造，即{ 0,0,0,0,0 }
    vector<int> v3(v2);     // 拷贝v2

    vector<int> v4 = { 1,2,3,4,5,6 };           // 用列表构造，C++11
    vector<int> v5(v4.begin(), v4.begin() + 3); // 迭代器构造，用v4的[0, 3)区间构造，即{ 1,2,3 }

    int a[] = { 7,8,9,10,11,12,13 };
    vector<int> v6(a, a + 5);       // 用a数组的[0, 5)区间构造，即{ 7,8,9,10,11 }
}

void test03()
{
    vector<int> v1 = { 1,2,3,4,5,6 };
    cout << v1.size() << endl;  // 获取v1中元素的个数。输出6
    v1.resize(3);               // 将v1的元素个数改为3，原来元素个数为6，会只要前面3个元素。 { 1,2,3 }
    v1.resize(10);              // 将v1的元素个数改为10。用默认值0填充。{ 1,2,3,0,0,0,0,0,0,0 }
    cout << v1.empty() << endl; // v1为空返回true，否则返回false
    cout << v1.capacity() << endl;  // 获取v1的存储空间能容纳多少元素
    v1.reserve(1000);            // 将v1扩容，至少能容纳1000个元素
    cout << v1.capacity() << endl;  // 输出1000
}

void test04()
{
    // vector提供了operator[]，支持下标访问
    vector<int> v1 = { 1,2,3,4,5,6 };
    v1[0] = 9;
    v1[1] = 9;
    for(int i = 0; i < v1.size(); i++)
        cout << v1[i] << ' ';
    cout << endl;

    cout << v1.front() << endl; // 访问第一个元素，相当于v1[0]
    v1.front() = 999;           // 将第一个元素修改为999
    cout << v1.front() << endl; // 输出999

    cout << v1.back() << endl;  // 访问最后一个元素，相当于v1[v1.size() - 1]。用法跟front()类似

    // vector也可以用迭代器访问
    auto it = v1.begin();       // 返回v1第一个元素的迭代器
    *it = 888;                  // 相当于v1[0] = 888
    while(it != v1.end())       // v1.end()返回v1最后一个元素下一个元素的迭代器
    {
        cout << *it << ' ';
        ++it;
    }
}

void test05()
{
    vector<int> v1 = { 1,2,3 };
    v1.push_back(9);    // 尾插9    v1: { 1,2,3,9 }
    v1.pop_back();      // 尾删     v1: { 1,2,3 }

    // 在指定位置插入/删除。效率不高一般不建议用
    v1.insert(v1.begin() + 1, 100); // 在v1[1]处插入100，v1: { 1,100,2,3 }
    v1.erase(v1.begin() + 2);       // 删除v1[2]，v1: { 1,100,3 }
    
    vector<int> v2(5, 1);
    v2.emplace_back(10);    // 尾插10。跟push_back用法类似，效率一般略高于push_back
    v1.swap(v2);    // 交换v1与v2

    v1.clear(); // 清空v1
}

void test06()
{
    vector<int> v1 = { 1,2,3 };
    vector<int> v2 = { 1,2,3,1 };
    if(v1 < v2) 
        puts("v1 < v2");
    else    
        puts("v1 >= v2");
}

#include<algorithm>
void test07()
{
    vector<int> v = { 5,2,7,4,1,9 };
    sort(v.begin(), v.end());       // 默认升序
    for(auto e : v) cout << e << ' ';
    cout << endl;

    sort(v.begin(), v.end(), greater<int>());   // 降序
    for(auto e : v) cout << e << ' ';
}

namespace Wang
{

void test01()
{
    vector<int> v0;
    vector<int> v1(5, 2);
    vector<string> v2(4, "abc");
}

void test02()
{
    vector<string> vs0(3, "abc");
    // vector<string> vs1 = vs0;       // 这里会崩溃

    vector<string> vs1(2, "xx");
    vs1 = vs0;
}   

void test03()
{
    vector<string> vs0(3, "abc");
    auto it = vs0.begin();
    while(it != vs0.end())
    {
        cout << *it << endl;
        ++it;
    }
    cout << endl;

    // 也可以用范围for，底层与上面代码类似
    for(auto& e : vs0)
        cout << e << endl;
}

void test04()
{
    vector<int> v;
    for(int i = 0; i < 10; i++)
        v.insert(v.end(), i);
    
    for(int i = 0; i < 10; i++)
    {
        auto pos = find(v.begin(), v.end(), i);
        v.erase(pos);
        for(auto e : v) cout << e << ' ';
        cout << endl;
    }
    // for(int i = 0; i < 10; i++)
    // {
    //     v.pop_back();
    //     for(auto e : v) cout << e << ' ';
    //     cout << endl;
    // }
    // v.pop_back();
}

void test05()
{
    auto il = { 1,2,3,4,5,6,7 };
    for(auto& e : il)
    {
        // e = 10; // err，e是只读的
        cout << e << ' ';
    }
    // 输出：1 2 3 4 5 6 7 
    cout << endl;
    vector<int> v = il;
}

void test06()
{
    vector<int> v1 = { 1,2,3 };
    v1.resize(5); // { 1,2,3,0,0 }
    for(auto e : v1) cout << e << ' ';
    cout << endl;
    v1.resize(2); // { 1,2 }    
    for (auto e : v1) cout << e << ' '; 
    cout << endl;
}

void test07()
{
    vector<int> v = { 1,2,3,4,5,6,7 };
    for(auto e : v) 
        cout << e << ' ';
}

}// namespace Wang

void test08()
{
    // vector<int> v = { 1,3,5,7,9,2 };
    // vector<int>::iterator it = find(v.begin(), v.end(), 5);
    // cout << *it << endl;

    int a = int(); // 0
    int b = int(3); // 3
    double d = double();    // 0
    char c = char();    // '\0'，其ASCII码值就是0
}
#endif

namespace Wang
{
void test08()
{
    vector<int> v(10, 2);   // 我想用10个2构造，却调用了迭代器区间构造
    for(auto e : v)
        cout << e << ' ';
}
}
int main()
{
    Wang::test08();
    // test08();
    // string s1 = "abc";
    // string s2;
    // memcpy(&s2, &s1, sizeof(s1));
    // A<int,char> a1(1, 'a');
    // A<int,char> a2 = a1;
    return 0;
}

// template<class T1, class T2>
// class A
// {
//     T1 t1;
//     T2 t2;
// public:
//     A(const T1& x, const T2& y)
//         :t1(x)
//         ,t2(y)
//     {}

//     //会解析成const A<T1, T2>& a “注入类名”
//     A(const A& a)
//     {
//         t1 = a.t1;
//         t2 = a.t2;
//     }
// };